#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    pid_t id = fork();
    if (id < 0)
    {
        perror("fork");
        return errno;
    }
    else if (id == 0)
    {
        // child
        int cnt = 1;
        while (cnt)
        {
            printf("child, pid: %d, ppid: %d, cnt: %d\n", getpid(), getppid(), cnt);
            cnt--;
            //sleep(1);
        }
        exit(1); // 为了测试明显， 我们改成1
    }
    else 
    {
        //parent
        int status = 0;
        while (1) // 轮询
        {
            pid_t ret = waitpid(id, &status, WNOHANG); // 非阻塞
            if  (ret > 0) // 父进程拿到的id就是子进程的pid
            {
                if (WIFEXITED(status))
                {
                    printf("进程是正常跑完的，退出码：%d\n", WEXITSTATUS(status));
                }
                else 
                {
                    printf("进程出异常了\n"); // 走到这里父进程调用没问题，是子进程出异常了
                }
                break;
            }
            else if (ret < 0)
            {
                printf("wait failed!\n"); // 走到这里是父进程调用waitpid函数失败了
                break;
            }
            else 
            {
                // ret == 0
                printf("子进程还没有退出，我再等等\n");
                //sleep(1);
            }
        }
        //sleep(3);
    }
    return 0;
}


